package com.gzxt.agricultural.utils;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.List;

@Component
public class WeBASEUtils {
    //通过工具类 读取指定路径下的abi文件 把他读取成为一个字符串
    public static final String ABI=IOUtils.readResourceAsString("abi/Trace.abi");
    @Value("${project.webase-url}")
    private String webaseUrl;
    @Value("${system.contract.contractAddress}")
    private String contractAddress;
    //这个方法就可以去发送一个网络请求（WeBASE-Front的接口）
    //用户地址，想要调用的函数名称，参数
    public String funcPost(String userAddress, String funcName, List funcParam){
        //abi需要转成json数组
        JSONArray abiJSON = JSONUtil.parseArray(ABI);
        //通过工具类创建JSONObject对象
        JSONObject data = JSONUtil.createObj();
        data.set("groupId","1");
        data.set("user", userAddress);
        data.set("contractName", "Trace");
        data.set("funcName", funcName);//你要调用哪个函数 由她来决定
        data.set("funcParam", funcParam);//有写函数有参数 有些函数没有参数 但是都得传入一个List集合
        data.set("contractAddress", contractAddress);//合约地址
        data.set("contractAbi", abiJSON);//abi字符串需要转化为json格式才行
        data.set("useAes", false);
        data.set("useCns", false);
        //http://localhost:5002/WeBASE-Front/trans/handle 发送post请求 传入json格式
        //创建一个httpclient发送post请求 携带上面的参数 请求那个网址
        String dataString = JSONUtil.toJsonStr(data);
        // 创建httpClient
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // 创建post请求方式实例
        HttpPost httpPost = new HttpPost(webaseUrl);
        // 设置请求头 发送的是json数据格式
        httpPost.setHeader("Content-type", "application/json;charset=utf-8");
        // 设置参数---设置消息实体 也就是携带的数据
        StringEntity entity = new StringEntity(dataString, Charset.forName("UTF-8"));
        // 设置编码格式
        entity.setContentEncoding("UTF-8");
        // 发送Json格式的数据请求
        entity.setContentType("application/json");
        // 把请求消息实体塞进去
        httpPost.setEntity(entity);
        // 执行http的post请求
        CloseableHttpResponse httpResponse;
        String result = null;
        try {
            //执行请求
            httpResponse = httpClient.execute(httpPost);
            result = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;

    }

}
